﻿<?php

require('parse.php');

/**
 * Helper craw function
 */
function crawLink($date) {
	$limit	= date('Y-m-d');
	
	while($date <= $limit) {
		echo '<div class="header">Crawling::date ['.$date.' / '.$limit.']</div>';
		echo '<div class="content">';
		#Lấy dữ liệu của ngày $dateMin
		xs::crawLink($date);
		#Chuyển qua ngày kế tiếp
		$date = date('Y-m-d',strtotime("$date +1 day"));
		echo '</div>';
		flush(); ob_flush();
	}			
}
function crawData($date) {
	$items 	= xs::getRaws($date,0);
	foreach($items as $item) {
		xs::crawContent($item->link,$item->data,$item->date);
	}
}
function crawCalendar() {
	xs::crawCalendar();
}
function crawLive() {
	// Craw từ 24h.com.vn
	$link = array(
		'http://xoso.tructiep.vn/ajax/ajaxXMLMB.aspx',
		'http://xoso.tructiep.vn/ajax/ajaxXMLMT.aspx',
		'http://xoso.tructiep.vn/ajax/ajaxXMLMN.aspx'
	);
	$time = date('H:i');

	do 
	{
		if('16:00' < $time && $time < '17:00') {
			live::craw($link[2],2);
		}
		if('17:00' < $time && $time < '18:00') {
			live::craw($link[1],1);
		}
		if('19:00' < $time && $time < '20:00') {
			live::craw($link[0],0);
		}
		$time = date('H:i');
		sleep(10);
	} while('16:00' < $time && $time < '20:00');
}
abstract class live
{
	static function craw($link,$area) {
		global $db;
		$link = $link.'?mdate='.date('d/m/Y');
		$xml  = simplexml_load_file($link,'SimpleXMLElement', LIBXML_NOCDATA);
		$titleList = array(
			'giaidacbietsauso'	=> 0,
			'giaidacbiet'		=> 0,
			'giainhat' 			=> 1,
			'giainhi' 			=> 2,
			'giaiba' 			=> 3,
			'giaitu' 			=> 4,
			'giainam' 			=> 5,
			'giaisau' 			=> 6,
			'giaibay' 			=> 7,
			'giaitam' 			=> 8,
		);
		$done 	= 1;
		$items  = self::getNames();
		$matche = array();
		$result = array();
		// Nếu là giải xổ số không phải Miền Bắc
		if($area > 0) {
			// Duyệt qua danh sách các giải
			foreach(get_object_vars($xml) as $code => $item) {
				$lid = isset($items[$code]) ? $items[$code]->id : null;
				$result[$code]['lid'] = $lid;
				$result[$code]['area'] = $area;
				$result[$code]['code'] = $code;
				// Duyệt qua danh sách các trường dữ liệu trong giải
				foreach(get_object_vars($item) as $k => $v) {
					$v = trim($v);
					if(isset($titleList[$k])) {
						$k = $titleList[$k];
						// Nếu chưa có dữ liệu, xs miền nam có 2 giải đặc biệt
						// Loại bỏ giải ĐB 5 số
						if(empty($result[$code]['data'][$k])) {
							$result[$code]['data'][$k] = str_replace('<br />',',',$v);
						}
					} else if(preg_match('/dau(\d)/ism',$k,$matche)){
						$k = $matche[1];
						$result[$code]['extra'][$k] = $v;
					} else {
						$result[$code][$k] = $v;
					}
				}
				
				if($result[$code]['status']!='quayxong') {
					$done = 0;
				}
	
				// Nếu kết quay xong lưu kết quả vào database
				if($result[$code]['status']=='quayxong' && $lid) {
					$obj = new JObject($db,'#__xs_result');
					$obj->lid = $lid;
					$obj->date = date('Y-m-d');
					$obj->extension = json_encode($result[$code]['extra']);
					$suffix = array();
					$extra  = array();
					foreach($result[$code]['data'] as $i => $item) {
						$obj->{'a'.$i} = $item;
						// Tách các giải
						$arr = explode(',',$item);
						$suffix = array();
						// Duyệt qua các số kết quả
						foreach($arr as $v) {
							$suffix[] = substr($v,-2);
						}
						$extra[] = implode(',',$suffix);
					}
					foreach($extra as $i => $item) {
						$obj->{'b'.$i} = $item;
					}
					$obj->store(true);
				}
			}
		} else {
			// Nếu là giải xổ số miền bắc
			$code = 'MB';
			$lid = isset($items[$code]) ? $items[$code]->id : null;
			$result[$code]['lid'] = $lid;
			$result[$code]['area'] = $area;
			$result[$code]['code'] = $code;
			// Duyệt qua danh sách các trường dữ liệu trong giải
			foreach(get_object_vars($xml) as $k => $v) {
				if(strpos($k,'@')===0) {
					continue;
				}
				$k = trim($k);
				$v = trim($v);
				if(isset($titleList[$k])) {
					$k = $titleList[$k];
					// Nếu chưa có dữ liệu, xs miền nam có 2 giải đặc biệt
					// Loại bỏ giải ĐB 5 số
					if(empty($result[$code]['data'][$k])) {
						$result[$code]['data'][$k] = str_replace('<br />',',',$v);
					}
				} else if(preg_match('/dau(\d)/ism',$k,$matche)){
					$k = $matche[1];
					$result[$code]['extra'][$k] = $v;
				} else {
					$result[$code][$k] = $v;
				}
			}
			
			if($result[$code]['status']!='quayxong') {
				$done = 0;
			}

			// Nếu kết quay xong lưu kết quả vào database
			if($result[$code]['status']=='quayxong' && $lid) {
				$obj = new JObject($db,'#__xs_result');
				$obj->lid = $lid;
				$obj->date = date('Y-m-d');
				$obj->extension = json_encode($result[$code]['extra']);
				$suffix = array();
				$extra  = array();
				foreach($result[$code]['data'] as $i => $item) {
					$obj->{'a'.$i} = $item;
					// Tách các giải
					$arr = explode(',',$item);
					$suffix = array();
					// Duyệt qua các số kết quả
					foreach($arr as $v) {
						$suffix[] = substr($v,-2);
					}
					$extra[] = implode(',',$suffix);
				}
				foreach($extra as $i => $item) {
					$obj->{'b'.$i} = $item;
				}
				$obj->store(true);
			}			
		}

		// Tạo cache
		$params = array();
		$params['area'] = $area;
		$params['data'] = $result;
		$path  = 'template/live.tpl.php';
		$cache = render($path,$params,false);
		$cache = string::compress($cache);
		// Lưu dữ liệu vào database
		$table = new JObject($db,'#__xs_live');
		$table->area = $area;
		$table->date = date('Y-m-d');
		$table->raw = trim($xml);
		$table->data = json_encode($result);
		$table->cache = $cache;
		$table->state = $done;
		$table->store(0);
		
		//print_r($result);	
	}
	static function &getNames() {
		global $db;
		
		$list = array();
		$result = array();
		
		$query = ' SELECT id,name,code,area';
		$query.= ' FROM #__xs_location';
		
		$list = $db->setQuery($query);
		$list = $db->loadObjectList();
		
		foreach($list as $item) {
			$result[$item->code] = $item;
		}
		
		return $result;
	}
}
/*
 * Convert data: 
 *	INSERT INTO `xs_location` (location_name,location_alias,location_index) SELECT name,alias,region FROM jos_xosoname
 * Fix data: 
 *	UPDATE `xs_name` SET  `name` =  REPLACE(`name`, 'Xổ số ', '')
 *	UPDATE `xs_name` SET `region`='MB' WHERE `region`='Miền Bắc'
 *	-------------------------------------------------------------
 *	UPDATE `xs_location` SET `location_name`=REPLACE(`location_name`,'Xổ số ','')
 * 	UPDATE `xs_location` SET `location_index`='MB' WHERE `location_index`='Miền Bắc'
 */	
class xs
{
	/*
	 * @ Phân tích dữ liệu html
	 * @ params : 
	 * @	$html : html dom object
	 * @	$date : ngày lấy dữ liệu
	 * @ 	$store : có lưu dữ liệu vào database
	 */
	static function parse($link,&$html,$date,$store=true) {
		global $db;
		
		$error = '';
		
		$updateContent  = router::getParam('data',true);;
		$updateCalendar = router::getParam('lich',false);;
		
		#center div div[id=content]
		$content = $html->find('#content',0);
		
		if($content == false) {
			echo 'craw::Dữ liệu không hợp lệ ',$date; 
			$html->clear();
			unset($html);
			self::setError($date);
			return;
		}
		
		#Kiểm tra xem có bảng kết quả.
		$validate= $content->find('table tr td table tr td[class="name_tbl_ketquaxs"]');

		#Kiểm tra sự hợp lệ của dữ liệu
		if($validate == false) {
			$error = 'craw::Dữ liệu không hợp lệ.';
			$html->clear();
			unset($html);
			self::setError($date);			
			return;
		}
		
		$tableList = $content->find('table[style="margin-top:6px;"]');
		
		#Duyệt qua các bảng chứa dữ liệu các giải xs
		if($tableList) {
			#Định dạng ngày lấy dữ liệu để lưu vào database : 2012-10-20
			$date = date('Y-m-d',strtotime("$date"));

			#Lưu dữ liệu html
			if($store) {
				$table = new JObject($db,'#__xs_raw');
				$table->date = $date;
				$table->link = $link;
				$table->data = trim($html);
				$table->state = 0;
				$table->store();
			}
			
			foreach($tableList as $table) {
				#Nếu có chế độ lấy dữ liệu
				if($updateContent) {	
					// Kiểm tra xem có phải bảng kết quả | Quảng cáo
					$validate= $table->find('table tr td[class="name_tbl_ketquaxs"]');
	
					if($validate) {
						self::getData($table,$date);
					} else {
						$error = 'craw::Bảng dữ liệu kết quả không hợp lệ';
					}
				}
				#Nếu có chế độ lấy lịch mở thưởng
				if($updateCalendar) {
					// Kiểm tra xem có phải lịch mở thưởng
					$validate= $table->find('table tr td[class="ct_lichquayxoso"]');
					
					if($validate) {
						self::getCalendar($table);
					} else {
						$error = 'craw::Bảng dữ liệu lịch mở thưởng không hợp lệ';
					}
				}
			}
		} else {
			$error = 'craw::Không tìm thấy TableList.';
		}
		
		echo "Update done !...",'<br/>';
		
		$html->clear();
		unset($html);
	}
	/**
	 * Craw dữ liệu tường thuật trực tiếp
	 */
	static function crawLive() {
		global $db;
		$link = 'http://ketquaxoso.24h.com.vn/Home/updateKQXS';
		$contents = file_get_contents($link);
		if($contents == 'notNow') {
			echo 'Chưa có dữ liệu.<br/>';
		} else {
			/**
			 * Cấu trúc file dữ liệu tường thuật trực tiếp xổ số
			 * Nếu không có dữ liệu: notNow
			 * Nếu có dữ liêu :
			 *		Cấu trúc : bắc / trung / nam / setting
			 *		Đọc 24h.com.vn javascript để biết thêm về cấu trúc
			 */
			$result   = explode("@@---@@",$contents);	// Tách dữ liệu
			$check    = explode("-@@@-",$result[1]);	// B/T/N có dữ liệu hay không ?
			$dataList = explode("::::",$result[0]);		// Dữ liệu html các bảng B/T/N
			
			$region   = array('Miền Bắc','Miền Trung','Miền Nam');
			$dataLive = array();
			
			foreach($dataList as $k => $item)
			if(isset($check[$k]) && $check[$k])
			{
				$html   = loadHtmlString($item);
				$oTable = $html->find('table table',0);				// Table chứa dữ liệu
				
				$iRow   = count($oTable->children);					// Đếm số dòng
				$iCol 	= count($oTable->children(1)->children); 	// Đếm số cột có trong bảng
				
				// Duyệt qua các cột (giải) chứa dữ liệu các giải xs mở thưởng trong ngày
				for($c=1;$c<$iCol;$c++)
				{
					// Tên giải xs
					$nameData = array();
					// Duyệt qua các dòng trong cột chứa kết quả mở thưởng
					for($r=0;$r<$iRow;$r++)
					{
						$oRow = $oTable->children($r);
						
						// Nếu r = 0
						// Với giải Miền Bắc : giải nhất
						// Với các giải khác : Tên giải
						if($r == 0 && $k != 0) {
							// Nếu là các giải khác xs Miền Bắc
							$name = $oRow->children($c)->plaintext;
							$nameData['name'] = $name;
							// Chuyển sang dòng tiếp theo
							continue;
						} else {
							// Nếu là xs Miền Bắc, thiết đặt tên và đọc dữ liệu giải nhất
							$name = 'Miền Bắc';
						}
						
						// Chỉ số giải 1-7, giải đặc biệt = null
						$index = trim($oRow->children(0)->plaintext);
						$index = string::toNumber($index);
						
						// Kết quả giải
						$items = $oRow->children($c)->innertext;
						
						// Mảng các giá trị của giải : giải năm array()...
						$items = string::toNumberArray($items);
						
						// Nếu là giải đặc biệt set index = 0
						if(empty($index)) {
							$index = 0;
						}
						
						// Lưu dữ liệu vào mảng, nếu muốn lưu từng phần tử
						$nameData[$index] = implode('-',$items);
						
						// echo $index,' -> ',implode('-',$items),'<br/>';
					}
					$dataLive[$k][] = $nameData;
				}
				
				$html->clear();
				unset($html);
			}
			
			print_r($dataLive);
			
			// Lưu dữ liệu vào database
			$state = 0;
			$cache = '';
			$table = new JObject($db,'#__xs_live');
			$table->date = date('Y-m-d');
			$table->raw = $contents;
			$table->data = json_encode($dataLive);
			$table->cache = string::compress($cache);
			$table->state = $state;
			$table->store(0);
			
			// echo $contents;
		}		
	}
	/*
	 * @TODO: Craw data from html
	 */
	static function crawContent($link,$content,$date) {
		$html = loadHtmlString($content);

		self::parse($link,$html,$date,false);
		
		$html->clear();
		unset($html);		
	}
	static function crawLink($date) {
		#Định dạng ngày lấy dữ liệu : 20/11/2012
		$date = date('d-m-Y',strtotime("$date"));
		
		#Tạo link lấy dữ liệu : http://ketquaxoso.24h.com.vn/ngay-15-02-2012.html
		$link = 'http://ketquaxoso.24h.com.vn/ngay-' . $date . '.html';
		
		$html = loadHtml($link);
		
		self::parse($link,$html,$date,true);
		
		$html->clear();
		unset($html);
	}
	static function crawCalendar() {
		
		$_REQUEST['data'] = 0;
		$_REQUEST['lich'] = 1;
		
		$date	= '20-10-2010';
		$link 	= 'http://ketquaxoso.24h.com.vn/ngay-'.$date.'.html';
		$html 	= loadHtml($link);

		self::parse($link,$html,$date,false);

		$html->clear();
		unset($html);
	}
	static function getCalendar($data) {
		global $db;
		$error = '';
		$content = $data->children(1)->children(0)->children(0);	// Talbe calendar
		
		if(count($content->children)) {

			$result		= array();
			$listLich	= array();

			for($count=1;$count<count($content->children);$count++) {
				// Dữ liệu cho vào bảng Lịch mở thưởng
				$item = new stdClass;
				$item->date	= trim($content->children($count)->children(0)->plaintext);
				$item->mb 	= trim($content->children($count)->children(1)->innertext);
				$item->mt  	= trim($content->children($count)->children(2)->innertext);
				$item->mn 	= trim($content->children($count)->children(3)->innertext);
				$result[] = $item;

				// Dữ liệu cập nhật ngày mở thưởng các giải xổ số
				$dateOpen = trim($content->children($count)->children(1)->plaintext).' - MB;';
				$dateOpen.= trim($content->children($count)->children(2)->plaintext);
				$dateOpen.= trim($content->children($count)->children(3)->plaintext);
				// Tách dữ liệu các giải mở thưởng trong ngày
				$dataList = explode(';',$dateOpen);
				// Duyệt qua các tên - mã giải tách riêng tên và mã
				foreach($dataList as $line) {
					if(empty($line) || strpos($line,'-') < 1) {
						continue;
					}

					$name = '';
					$code = '';

					list($name,$code) = explode('-',$line);

					$name = trim($name);
					$code = trim($code);

					$list[$code][] = $count;
				}
			}

			// Lưu dữ liệu vào database
			$date = date('Y-m-d');
			$data = json_encode($result);
			
			$params = array();
			$params['data'] = $result;
			
			$path  = 'template/lich.tpl.php';
			$cache = render($path,$params,false);
			$cache = string::compress($cache);
			$table = new JObject($db,'#__xs_lich');			
			$table->date = $date;			
			$table->data = $data;
			$table->cache = $cache;			
			$table->store();

			// Lưu lịch mở thưởng các giải vào database
			foreach($list as $c => $d) {
				$table = new JObject($db,'#__xs_location');			
				$table->code = $c;
				$table->lich = json_encode($d);
				$table->store(1);
			}
			
		} else {
			$error = 'Lỗi: Không thể bóc tách dữ liệu lịch mở thưởng.';
		}
		return $result;
	}
	static function getData($data,$date) {
		global $db;

		$error  = '';
		
		$regionList = array('bắc'=>'MB','trung'=>'MT','nam'=>'MN');
		
		// Kiểm tra điều kiện $data
		if(count($data->children) < 2) {
			$error = 'getData::Dữ liệu không hợp lệ.';
			return;
		}

		// <td width="96%" class="tcat_box_main_yellow">
		// Kết quả xổ số Miền Bắc ngày 11/03/2011 (Thứ Sáu)
		// find('tr td[class="tcat_box_main_yellow"]',0)
		$header = $data->children(0);

		// Tên vùng
		$region = trim($header->plaintext);
		$region = explode(' ',$region);

		if(count($region) > 6) {
			$region = strtolower($region[5]);
		} else {
			$error = 'getData::Không thể bóc tách được tên miền.';
			return;
		}
		
		$region = $regionList[$region];

		for($node=1;$node<count($data->children);$node++) {
			$content = $data->children($node)->children(0)->children(0); 	//rowList
			$name = trim($content->children(0)->children(0)->plaintext);	//row 0 col 0	: Tền giải
			$extension = $content->children(0)->children(1);				//row 0 col 1	: Bảng soi cầu
			$extension = $extension->children(0);							//table extension : soi cầu, rowList

			$lid = self::getLid($name);
			
			if(empty($lid)) {
				$error = 'getData::Không thể lấy nid giải '.$name;
				continue;
			}

			$statitic = array();
			// Soi cầu
			if(count($extension->children) == 11) {
				for($count=1;$count<count($extension->children);$count++)
				{
					$row = str_replace('&nbsp;',"",$extension->children($count)->children(1)->plaintext);
					$statitic[] = $row;
				}
			} else {
				$error = 'Lỗi: Không thể bóc tách được dữ liệu soi cầu.';
			}

			$result = array();
			$resultExt = array();

			// Kết quả
			if(count($content->children) > 9) {
				for($count=1;$count<count($content->children)-1;$count++)
				{
					$row = trim($content->children($count)->children(1)->plaintext);
					$result[] = $row;
					$items = explode('-',$row);
					$suffix = array();
					#Duyệt qua các số kết quả
					foreach($items as $item) {
						$suffix[] = substr($item,-2);
					}
					$resultExt[] = implode(',',$suffix);
				}
			} else {
				$error = 'Lỗi: Không thể bóc tách được dữ liệu kết quả.';
			}
			
			#Lưu dữ liệu vào bảng xs_data
			if(count($result) > 0) {
				#Lưu kết quả soi cầu vào database
				$obj = new JObject($db,'#__xs_result');
				$obj->lid = $lid;
				$obj->date = $date;
				$obj->extension = json_encode($statitic);
				foreach($result as $i => $item) {
					$obj->{'a'.$i} = $item;
				}
				foreach($resultExt as $i => $item) {
					$obj->{'b'.$i} = $item;
				}
				$obj->store(true);
			}
		}	
	}
	/*
	 * TODO: Lấy mã giải xổ số từ tên giải
	 * params : $name tên giải xổ số
	 */
	static function getLid($name) {
		global $db;
		$db->setQuery('SELECT id FROM #__xs_location WHERE name='.$db->Quote($name));
		return $db->loadResult();
	}	 
	static function getNid($name) {
		global $db;
		$db->setQuery('SELECT id FROM #__xs_name WHERE name='.$db->Quote($name));
		return $db->loadResult();
	}
	static function setError($date) {
		global $db;
		
		$date = date('d-m-Y',strtotime("$date"));
		#Tạo link lấy dữ liệu : http://ketquaxoso.24h.com.vn/ngay-15-02-2012.html
		$link = 'http://ketquaxoso.24h.com.vn/ngay-' . $date . '.html';
		$date = date('Y-m-d',strtotime("$date"));
		
		$obj = new JObject($db,'#__xs_raw');
		$obj->date = $date;
		$obj->link = $link;
		$obj->state = 1; #lỗi
		$obj->store();
	}
	static function getRaws($date = null,$state = null) {
		global $db;

		$result = array();
		$query = ' SELECT *';
		$query.= ' FROM #__xs_raw';

		if($state != null) {
			$query.= ' WHERE state = '.$state;
		}
		if($date != null) {
			$query.= ' WHERE date >= '.$db->Quote($date);
		}
		$query.= ' ORDER BY date ASC';
		
		$db->setQuery($query); 
		
		$result = $db->loadObjectList();
		
		// echo str_replace('#__','a_',$query);		
		return $result;
	}
	
	/*
	 * Lay KQXS dien toan 123
	 */
	
	static function getXSMB($date = null)
	{
		global $db;
		
		$limit	= date('Y-m-d');
		
		while($date <= $limit) {
			echo '<div class="header">Crawling::date ['.$date.' / '.$limit.']</div>';
			echo '<div class="content">';
			#Lấy dữ liệu của ngày $dateMin
			self::crawXSMB($date);
			#Chuyển qua ngày kế tiếp
			$date = date('Y-m-d',strtotime("$date +1 day"));
			echo '</div>';
			flush(); ob_flush();
		}
	}
	
	static function crawXSMB($date)
	{
		global $db;
		$urls	=	array(
					'DT123'		=>	'http://ketqua.net/xo-so-dien-toan-123.php',
					'DT6x36'	=>	'http://ketqua.net/xo-so-dien-toan-6x36.php',
					'TT'		=>	'http://ketqua.net/xo-so-than-tai.php'
				);
		
		$param	='?ngay='.date('d/m/Y',strtotime($date));
		$arr	=	array();
		foreach($urls as $ku => $url)
		{
			$url .= $param;
			$html	=	new simpleDom();
			$html->load_file($url);
			$content	=	@$html->find('div#ketqua',0);
			$tmp	=	array();
			foreach($content->find('td.db') as $k => $v)
			{
				$tmp[]	=	$v->text();
			}
			
			//$arr[$ku]	=	$tmp;
			if(self::checkExisted($ku,$date) == false)
			{
				//die('aaaa');
				$obj = new JObject($db,'#__xs_northern');
				if($content)
				{
					$obj->status	=	1;
				}
				else
				{
					$obj->status	=	0;
				}
				
				$obj->date = $date;
				$obj->url = $url;
				$obj->data	=	json_encode($tmp);
				$obj->created_time	=	date('Y-m-d H:i:s');
				$obj->type	=	$ku;
				//$obj->state = 1; #lỗi
				if($tmp)
				{
					$obj->store();
					echo "<p>INSERT $ku on $date is successed!</p>";
				}
				else
				{
					echo "<p>Data $ku on $date is not Existed!</p>";
				}
				
			}
		}
		
		//print_r($arr);
		
	}
	
	static function checkExisted($type = null, $date = null)
	{
		global $db;
		$result = array();
		$query = ' SELECT *';
		$query.= ' FROM #__xs_northern';
		$query.= ' WHERE date = '.$db->Quote($date);
		$query.= ' AND type = '.$db->Quote($type);
		$query.= ' AND status = 1';
		$db->setQuery($query);
		$result = $db->loadObjectList();
		if($result)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

